package fiscal.entities.tables;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import exceptions.PersistenceExceptionMessage;
import fiscal.dao.PersistenceClassificacao;
import generic.interfaces.GenericPersistence;
import generic.interfaces.IDEntity;
import generic.interfaces.PersistInFile;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;


@SuppressWarnings("rawtypes")
@Entity
public class Classificacao implements IDEntity<String>, GenericPersistence<PersistenceClassificacao, String, Classificacao>, PersistInFile, Comparable<Classificacao> {
	
	public static PersistenceClassificacao persist = new PersistenceClassificacao();
	
	@Id
	@Column(length=8)
	private String id;
	@Column(length=60)
	private String descricao;
	//private Boolean isentoRenda;
	@Column(length=60)
	private String produtoEnquadrado;
	@OneToOne
	private Classificacao pai;
	
	/***************************************/
	/*@OneToOne
	private PisCofins PCEntrada;
	@OneToOne
	private PisCofins PCSaida;
	@OneToOne
	private TipoInventario tipoInventario;
	@OneToOne
	private TipoProduto tipoProduto;*/
	
	/***************************************/
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getDescricao() {
		return this.descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	/*public Boolean getIsentoRenda() {
		return isentoRenda;
	}
	public void setIsentoRenda(Boolean isentoRenda) {
		this.isentoRenda = isentoRenda;
	}*/
	public String getProdutoEnquadrado() {
		return produtoEnquadrado;
	}
	public void setProdutoEnquadrado(String produtoEnquadrado) {
		this.produtoEnquadrado = produtoEnquadrado;
	}
	public Classificacao getPai() {
		return this.pai;
	}
	public void setPai(Classificacao pai) {
		this.pai = pai;
	}
/*	public PisCofins getPCEntrada() {
		return PCEntrada;
	}
	public void setPCEntrada(PisCofins pCEntrada) {
		PCEntrada = pCEntrada;
	}
	public PisCofins getPCSaida() {
		return PCSaida;
	}
	public void setPCSaida(PisCofins pCSaida) {
		PCSaida = pCSaida;
	}
	public TipoInventario getTipoInventario() {
		return tipoInventario;
	}
	public void setTipoInventario(TipoInventario tipoInventario) {
		this.tipoInventario = tipoInventario;
	}
	public TipoProduto getTipoProduto() {
		return tipoProduto;
	}
	public void setTipoProduto(TipoProduto tipoProduto) {
		this.tipoProduto = tipoProduto;
	}*/
	
	public String toString() {
		if (id != null)
			return getClassificacaoMask();
		return super.toString();
	}
	
	public Classificacao find(String id) throws PersistenceExceptionMessage {
		return DAOInstance().find(id);
	}
	
	public PersistenceClassificacao DAOInstance() {
		if (persist == null) {
			persist = new PersistenceClassificacao();
		}
		return persist;
	}
	
	public void persist() throws PersistenceExceptionMessage {
		DAOInstance().persist(this);
	}
	
	public int removeAll() throws PersistenceExceptionMessage {
		return DAOInstance().removeAll();
	}
	
	public void remove() throws PersistenceExceptionMessage {
		DAOInstance().remove(this);
	}
	
	public Classificacao merge() throws PersistenceExceptionMessage {
		return DAOInstance().merge(this);
	}
	
	public ArrayList<Classificacao> findAll() throws PersistenceExceptionMessage {
		return (ArrayList<Classificacao>) DAOInstance().findAll();
	}
	public String computeIdPai() {
		if (getId() != null && getId().length() > 4 && getId().length() < 8)
			return getId().substring(0, getId().length() - 2);
		return null;
	}
	public String getClassificacaoMask() {
		if (getId() != null) {
			switch (getId().length()) {
				case 4:
					return getId() ;
				case 5:
					return getId() .substring(0, 4).toString() +"." +getId() .substring(4, 5).toString();
				case 6:
					return getId() .substring(0, 4).toString() +"." +getId() .substring(4, 6).toString();
				case 7:
					return getId() .substring(0, 4).toString() +"." +getId() .substring(4, 6).toString() +"." 
					+getId() .substring(6, 7).toString();
				case 8:
					return getId() .substring(0, 4).toString() +"." +getId() .substring(4, 6).toString() +"." 
					+getId() .substring(6, 8).toString();
			}
		}
		return null;
	}
	public int getNivel() {
		switch (getId().length()) {
			case 4:
				return 1;
			case 5:
				return 2;
			case 6:
				return 3;
			case 7:
				return 4;
			case 8:
				return 5;
			default:
				return -1;
		}
	}
	public int compareTo(Classificacao ncm) {
		return getId().compareTo(ncm.getId());
	}
	
	public boolean equals(Object obj) {
		if (obj instanceof Classificacao) {
			Classificacao ncm = (Classificacao) obj;
			return getId().equals(ncm.getId());
		}
		return false;
	}
	
	public Classificacao findPai() throws PersistenceExceptionMessage {
		return DAOInstance().findPai(this);
	}
	
	public String[] getPais() {
		if (this != null && getId().length() > 3) {
			String[] str = new String[4];
			for (int i = 4; i < getId().length(); i++) 
				str[i - 4] = getId().substring(0, i);
			return str;
		}
		return null;
	}
	/*public String getLineFile(Classificacao ncm) {
		return ncm.getId() +"|" +ncm.getDescricao() +"|" +ncm.getIsentoRenda()
				+"|" +ncm.getPCEntrada().getId() +"|" +ncm.getPCSaida().getId() 
				+"|" +ncm.getTipoInventario().getId()  +"|" +ncm.getTipoProduto().getId()
				+"|" +ncm.getProdutoEnquadrado() ;
	}*/
	public Classificacao getInstanceFromArray(String[] str) {
		for (String string : str) {
			if (string == null)
				return null;
			if (string.trim().length() == 0)
				return null;
		}

		if (str != null && str.length == 8) {
			Classificacao ncm = new Classificacao();
		
			ncm.setId(str[0].replace(".", "").trim());
			ncm.setPai(null);
			if (str[1].trim().length() > 60)
				ncm.setDescricao(str[1].trim().subSequence(0, 60).toString());
			else
				ncm.setDescricao(str[1].trim());
			
		/*	if (str[2].trim().equals("t") || str[2].trim().equals("v") || 
					str[2].trim().equals("true") || str[2].trim().equals("verdadeiro"))
				ncm.setIsentoRenda(true);
			else
				ncm.setIsentoRenda(false);
			
			PisCofins pc1 = new PisCofins();
			pc1.setId(str[3].trim());
			ncm.setPCEntrada(pc1);
			
			PisCofins pc2 = new PisCofins();
			pc2.setId(str[4].trim());
			ncm.setPCSaida(pc2);
			
			TipoInventario ti = new TipoInventario();
			ti.setId(str[5].trim());
			ncm.setTipoInventario(ti);
			
			TipoProduto tp = new TipoProduto();
			tp.setId(str[6].trim());
			ncm.setTipoProduto(tp);*/

			if (str[2].trim().length() > 255)
				ncm.setProdutoEnquadrado(str[2].trim().subSequence(0, 255).toString());
			else
				ncm.setProdutoEnquadrado(str[2].trim());
			
			return ncm;
		}
		return null;
	}
	@SuppressWarnings("unchecked")
	
	public Collection<Classificacao> order(ArrayList entities) {
		Collections.sort(entities);
		return entities;
	}
	public void mergePais() throws PersistenceExceptionMessage {
		DAOInstance().mergePais();
	}
	
	
	public ArrayList<String> getArrayAsString() throws PersistenceExceptionMessage {
		/*ArrayList<String> ncmToFile = new ArrayList<String>();
		for (Classificacao classificacao : order((ArrayList) DAOInstance().findAll())) {
			ncmToFile.add(getLineFile(classificacao));
		}
		return ncmToFile;*/
		return null;
	}
}
